<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ECMA测试</title>
  </head>
  <body>
    <script>
      //  1.  Javascript 的数据类型有几种？分别又有哪些类型？（5）
      //string  number  NAN  undefined  object  array  BigInt  null  Boolean

      //  2.  return 有哪两个作用？ 构造函数里 return 会怎么样？（5）
      // return可以用来来定义返回值，还能终止函数的执行;
      // 构造函数里用return书写形式来过滤条件

      //  3.  undefined 和 null 的区别？什么时候会得到undefined？（5）
      // 当我们声明一个变量但没有对其进行初始化，它默认为 undefined
      // null 通常用来初始化对象

      //  4.  使用 continue 或 break 终止循环时，两种方式的区别是？（5）
      // break 用于跳出一个循环体或者结束一个循环，可以结束其所在的循环，也可以跳出其外层循环
      // continue 用于跳出循环的迭代，继续执行下一轮的循环

      //  5.  如何判断字符串内是否包含指定字符？（5）
      // 用 indexOf 进行查找
      // eg: var str = '我爱学习';
      //     str.indexOf(0, '爱');// 第一个参数代表查找开始的位置，第二个参数是要查找的字符

      //  6. 值传递和引用传递的区别？ （5）
      // 值传递会改变参数的值

      //  7. 请尽量列举出数组的方法，并注明其作用以及会不会修改原数组，至少10种（10）
      // （1）修改数组的元素
      // eg: var arr = ['abc', 'cba', 'nba']
      //     arr[0] = 'tizzy';//会修改原数组
      //     console.log(arr);// ['tizzy', 'cba', 'nba']
      // （2）数组的添加或删除方法
      // 在尾端增加用 push ，在首端增加用 unshift，会修改原数组
      // 在尾端删除用 pop ，在首端删除用 shift，会修改原数组
      // splice 可以用来添加、删除和替换元素，会修改原数组
      // （3）slice 用于对数组进行截取，不会修改原数组   语法：arr.slice(begin[,end])
      // （4）concat 用于数组的拼接，不会修改原数组
      // （5）join 用于把数组的元素连接成一个字符串，不会修改原数组   语法：arr.join([连接符])
      // （6）indexOf 用于查找数组的元素，不会修改原数组   语法：arr.indexOf(searchElment[,fromIndex])
      // （7）includes 查找数组的元素，找到返回 true ，没找到返回-1，不会修改原数组
      // （8）sort 用于数组元素的排序，会修改原数组   语法：arr.sort(a-b) 从小到大排序；arr.sort(b-a) 从大到小排序
      // （9）reverse 用于颠倒数组，会修改原数组
      // eg: var arr = ['abc', 'cba', 'nba']
      //     arr.reverse();// ['nba','cba','abc']
      // （10）forEach 用于遍历数组，让数组的每个元素都执行对应的方法  语法:arr.forEach(function(item,index,arr){})

      //  8.  请写出以下输出的结果和原因；（10分）
      var bar = true,
        number = 0;
      console.log(bar + 0); // 1  运算把 bar 转成 number 类型，true 为 1
      console.log(bar + 'xyz'); // truexyz 与字符串参与运算，bar 转成 string 类型
      console.log(bar + true); // 2 运算把 bar 转成 number 类型，true 为 1
      console.log(+true); // 1 运算符 '+' 把 Boolean 类型的 true 转为 number
      console.log(!'bluej'); // false
      console.log(number++); // 0 后置自增，先用后加
      console.log(++number); // 2 前置自增，先加后用
      console.log(number); // 2 继承上面的number
      10 > 20 || console.log('haha'); // haha 逻辑运算符 或，从左往右计算操作数，结果是 true，就停止计算
      10 > 20 && console.log('haha'); // false 逻辑运算符 与，从左往右计算操作数，结果是 false，就停止计算

      //  9. 将多个数组进行合并后再去重；对于去重的方案要求3种及以上（10分）
      // var arr1 = [1, 2, 3],
      //   arr2 = [2, 3, 4, 5];
      // var newArr = arr1.concat(arr2);
      // console.log(newArr);
      // 去重方法一
      // newArr.sort(function (a, b) {
      //   return a - b;
      // });
      // for (var i = 0; i < newArr.length; i++) {
      //   if (newArr[i] === newArr[i + 1]) {
      //     newArr.splice(i, 1);
      //     i--;
      //   }
      // }
      // console.log(newArr);
      // 去重方法二
      // var newArr1 = [];
      // for (var i = 0; i < newArr.length; i++) {
      //   if (newArr1.indexOf(newArr[i]) === -1) {
      //     newArr1.push(newArr[i]);
      //   }
      // }
      // console.log(newArr1);
      // 去重方法三
      // console.log([...new Set(newArr)]);

      //10.将 str="再见，还会再见吗燕子，再见的时候你要幸福好不好，燕子你要开心，你要幸福，好不好，开心啊，幸福！你的世界以后没有我了，没关系你要幸福，🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊燕子，燕子，燕子，燕子，燕子，燕子，燕子你把我带走吧，燕子！"里面的所有"燕子"替换成"jack"不要用replaceAll(10分)
      /* var str =
        '再见，还会再见吗燕子，再见的时候你要幸福好不好，燕子你要开心，你要幸福，好不好，开心啊，幸福！你的世界以后没有我了，没关系你要幸福，🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊燕子，燕子，燕子，燕子，燕子，燕子，燕子你把我带走吧，燕子！';
      for (var i = 0; i < str.length; i++) {
        if (str[i] + str[i + 1] == '燕子') {
          str = str.replace(str[i] + str[i + 1], 'jack');
        }
      }
      console.log(str); */

      //11. 找出数组中年龄小于18岁的女生(girl)的信息重新组成新的数组,并且将她们count变为现有的平方（10分）
      /* var arr3 = [
        { name: '彭于晏', sex: 'boy', age: 18, count: 20 },
        { name: '迪丽热巴', sex: 'girl', age: 17, count: 30 },
        { name: '吴彦祖', sex: 'boy', age: 16, count: 40 },
        { name: '古力娜扎', sex: 'girl', age: 15, count: 50 },
        { name: '刘德华', sex: 'boy', age: 20, count: 60 },
        { name: '刘亦菲', sex: 'girl', age: 13, count: 70 },
        { name: '张学友', sex: 'boy', age: 14, count: 80 },
      ];
      var newArr = arr3.filter(function (item) {
        return item.age < 18 && item.sex === 'girl';
      });
      for (var item of newArr) {
        item.count *= item.count;
      }
      console.log(newArr); */

      // 12. 统计字符串'abbcccddddd'中每个字符出现的次数，统计数组['a','b','b','c','c','c','d','d','d','d','d'中每个字符出现的次数(10分)
      /*  var str = 'abbcccddddd';
      var obj1 = {};
      for (var i = 0; i < str.length; i++) {
        obj1[str[i]] ? (obj1[str[i]] += 1) : (obj1[str[i]] = 1);
      }
      console.log(obj1);
      var arr = ['a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd'];
      var obj2 = {};
      for (var item of arr) {
        obj2[item] ? (obj2[item] += 1) : (obj2[item] = 1);
      }
      console.log(obj2); */
    </script>
  </body>
</html>
